/*
================================================================================
	Plik: f_brpl.c
--------------------------------------------------------------------------------
	Autorzy: Piotr Zdunek, Mateusz Słowikowski, Krzysztof Wiąckowski
	Projekt:Model mikrokontrolera AVR
	Kompilator: avr-gcc-4.3.5
	Doc: doxygen 1.7.4
--------------------------------------------------------------------------------
	Zawiera:
--------------------------------------------------------------------------------
	Komentarze:
================================================================================
*/

/*! \file f_brpl.c
 * \brief Plik opisujący funkcję BRPL
 */

#include "types.h"
#include "mem_abs.h"

/*TODO!!! Opis BRPL do poprawienia
 * Funkcja BRPL Branch if plus. Branch czyli skok. Jeśli w wyniku poprzedniej
 * wykonanej operacji została ustawiona flaga N, to ma być skok do innego adresu. Czyli ma być
 * Zwiększone PC k o k. K zawiera się w przedziale (-64,+64). Nie testowałem czy działa do tyłu, ale
 * teoretycznie powinno.
 *
 * Przykład kodu assemblera, który testuje tę funkcję
 *
 * add r5,r6 ; r5 = 5,r6 = 9
 * branch przep
 * and r1,r2
 * and r2,r3
 * and r3,r4
 * ...
 * przep: nop
 * and r1,r2 <- test czy kolejna operacja się wykoan
 *
 */

void F_BRPL(void){

/*!  void F_BRPL(void){}
	 *  \n \n
	 *  BRPL(Branch if plus)\n
	 *  Branch czyli skok. Jeśli w wyniku poprzedniej
	 *	wykonanej operacji została ustawiona flaga N, to ma być skok do innego adresu.
	 *
	 *  \ref pagebrpl \n
	 */

#ifndef DEBUG_MODE
	printf("Function BRPL.\n");
#endif


//Pobranie wartości stałej skoku z instrukcji
	int k_temp = (getMEMC(getPC()) & 0x0FFF);

	int8_t k = (k_temp & 0b001111111000) >> 3;

// Sprawdzenie warunku ustawienia flagi N
// jeśli warunek jest spełniony to skok o k
// jeśli nie to skok o 1

	if( GetFlagRegisterStatus(FLAG_N) == 0) incPC_k(k);
	else incPC();

}
/*! \page pagebrpl Opis działania funkcji BRPL
 *
 *  BRCC (Branch if plus) \n
 *	Branch czyli skok. Jeśli w wyniku poprzedniej
 *	wykonanej operacji została ustawiona flaga N, to ma zostać wykonany skok do innego adresu.
 *
 *	\dontinclude f_brpl.c
 *
 *	\section sec_brplone Wykonywane operacje
 *
 *	1. Pobranie informacji o k:
 *	\skipline k_temp
 *	\skipline int8
 *	2. Sprawdzenie warunku ustawienia flagi N jeśli warunek jest spełniony to skok o k, jeśli nie to skok o 1
 *	\skipline incPC_k
 *	\until incPC
 *
 *	\section sec_brpltwo Kod źródłowy funkcji
 *
 *	\include f_brpl.c
 *
 */
